node.jsのいろいろなモジュール22 – mochaでテストを書こう
mochaとは
mocha(モカ)は、javascriptの単体テストでよく使用されているテストフレームワークです。 node.jsやブラウザから実行ですることもできます。また、非同期のテストも可能になってます。 なお、mocha自体はアサーション機能は持っていません。なので、値の検証は標準のassertとかchaiとかshouldを使用します。 TDDやBDDスタイルでテストを記述でき、テスト結果もいろいろな形式で出力できます。 今回はmochaの基本的な使用方法について紹介します。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.4
- Node.js : v0.8.15
- npm : 1.1.66
適当なディレクトリを作成し、そこでnpmを使用してmochaをインストールします。 mochaコマンドを使用するので、gオプションつきでインストールしましょう。
% mkdir mocha % cd mocha % npm install -g mocha
テストを書いてみる
モジュールの作成
まずはテスト対象のモジュールを作成しましょう。 シンプルな関数を2つ持つ、myModule.jsファイルを作成します。 なお、greetAsyncはコールバックを受け取る非同期関数になっています。
//myModule.js exports.greet = function(name) { return "Hello,"+ name; } exports.greetAsync = function(name,callback) { var greet = "Hello,"+ name; callback(greet); }
テストモジュールの作成
次にテストモジュールを作成してみます。同じディレクトリにtest.jsを作成しましょう。 describeとitを使用してテストケースを区切ります。テストケース内ではassertモジュールを使用して値の検証をしています。
var assert = require('assert'); var myModule = require('./myModule'); describe('myModule', function () { describe('greet', function () { it('引数に応じて決まった文字列を返すこと', function () { assert.equal(myModule.greet('taro'), 'Hello,taro'); }); }); });
テスト実行
テストを実行してみましょう。 mocha <テストモジュール名>でテストが実行されます。
% mocha test.js ․ 1 test complete (1 ms)
非同期のテスト
greetAsync(非同期関数)のテストも追加してみましょう。この関数は、コールバック内でアサーションを行なっています。
describe('myModule', function () { describe('greet', function () { it('引数に応じて決まった文字列を返すこと', function () { assert.equal(myModule.greet('taro'), 'Hello,taro'); }); }); describe('greetAsync', function () { it('引数に応じてコールバック内で決まった文字列になること', function (done) { myModule.greetAsync('hanako', function (greet) { assert.equal(greet, 'Hello,hanako'); done(); }); }); }); });
最後にdoneという関数を呼び出しています。この関数が呼ばれるまで次のテストは実行されません。
beforeとafter
describe関数やit関数が実行されるごと、または実行された後に特定の処理を行いたいケースがあります。 そのようなときに使用する関数があります。下記定義をtest.jsに追加してみましょう。
var assert = require('assert'); var myModule = require('./myModule'); before(function (done) { console.log('[describe]before test') done(); }); after(function (done) { console.log('[describe]after test') done(); }); beforeEach(function (done) { console.log('[it]before every test'); done(); }); afterEach(function (done) { console.log('[it]after every test') done(); }); ・ ・ ・
beforeは全テスト前、afterは全テスト後、beforeEachはitの前、afterEachはitの後に毎回実行されます。
出力形式
いままでのテスト結果は出力形式(reporter)が非常にシンプルなものでしたが、mochaではいろいろな形式のテスト結果を指定できます、 specというreporterを指定してみましょう。reporterは「-R」か「--reporter」で指定します。
% mocha -R spec test.js myModule greet ✓ 引数に応じて決まった文字列を返すこと greetAsync ✓ 引数に応じてコールバック内で決まった文字列になること
spec以外にもlist、progress、tap、jsonなど、さまざまなreporterが指定可能です。
ファイルの変更監視
テストの変更を検知して自動で実行する機能もあります。 下記コマンドを入力してください。コンソールに「watching」と表示され、待ち状態になるはずです。
% mocha -w test.js
この状態でtest.jsを変更すると、テストが実行されます。
まとめ
今回は高機能なテストフレームワーク、mochaについて紹介しました。 このフレームワークは非常に高機能で、紹介した以外にもいろいろな機能を持っています。 詳しくは公式サイトをご確認ください。